%%%-------------------------------------------------------------------
%%% @author Rain
%%% @doc 网络相关
%%% @end
%%%-------------------------------------------------------------------
-author("Rain").

-define(NETWORK_RECV_TIMEOUT, 5000). % 网络接收超时


-define(NET_MOD_WEBSOCKET,  websocket). % 网络模式 - websocket
-define(NET_MOD_TCP,              tcp). % 网络模式 - tcp

-define(WS_HEAD_LEN, 2). % websocket头部数据具体参考wiki Frame structure - 2字节
-define(WS_MASK_LEN, 4). % websocket mask数据具体参考wiki Frame structure - 4字节

-define(TCP_HEAD_LEN, 2). % tcp头

-define(NET_STEP_INIT,              0). % 网络步骤 - 初始化
-define(NET_STEP_HANDSHAKE,         1). % 网络步骤 - 握手完成
-define(NET_STEP_FIRST_PACK_DONE,   2). % 网络步骤 - 首包连接成功
-define(NET_STEP_BREAK,             3). % 网络步骤 - 断开


-define(NET_PACK_STEP_HEAD,     1). % 网络数据包步骤 - 收取包头
-define(NET_PACK_STEP_BODY_LEN, 2). % 网络数据包步骤 - 收取包体长度
-define(NET_PACK_STEP_BODY,     3). % 网络数据包步骤 - 收取包体

-define(WS_OP_CODE_CONTINUATION,    0). % ws操作码 - 标识碎片消息的中间帧
-define(WS_OP_CODE_TEXT,            1). % ws操作码 - UTF8编码的文本
-define(WS_OP_CODE_BINARY,          2). % ws操作码 - UTF8编码的二进制数据
-define(WS_OP_CODE_CLOSE,           8). % ws操作码 - 关闭握手
-define(WS_OP_CODE_PING,            9). % ws操作码 - ping
-define(WS_OP_CODE_PONG,           10). % ws操作码 - pong

-define(WS_SMALL_PACK,  125). % ws小数据包标识
-define(WS_MID_PACK,    126). % ws中数据包标识
-define(WS_BIG_PACK,    127). % ws大数据包标识

-define(WS_MID_PACK_BIT_LEN, 16). % ws中数据包长度占用二进制位(16位)
-define(WS_BIG_PACK_BIT_LEN, 64). % ws大数据包长度占用二进制位(64位)

-define(NETWORK_LOOP_TICK, 1000). % network默认循环tick

-define(HEART_BEAT_TIMEOUT, 60). % 1分钟不心跳则心跳超时断开连接结束网络连接

-define(NET_MAIN_ID_FIELD_SIZE, 8). % 网络主id字段大小 - 8位
-define(NET_SUB_ID_FIELD_SIZE,  8). % 网络子id字段大小 - 8位
-define(NET_LENGTH_FIELD_SIZE, 16). % 网络子长度字段大小 - 16位

-define(G2C_MSG(NetState, Msg), game_protocol:gate_to_client_msg(NetState, Msg)). % Gate进程发送给客户端的消息

-record(net_state, {
    socket,
    transport,
    ranch_ref :: reference(), % ranch返回来的Ref,目前暂时没用
    net_mod :: atom(), % 网络模式 tcp | websocket
    net_mod_module :: atom(), % 网络模式回调模块
    net_step = ?NET_STEP_INIT :: integer(),
    pack_info = #{} :: map() , % 包里面的需要复用的数据
    pack_step :: integer(), % 包进度
    pack_ref :: reference() | undefined,
    pack_fin = 0 :: integer(), % 包结束的标识(?TRUE | ?FALSE)
    pack_cache = <<>> :: binary(), % 缓存起来没拼接完成的包数据
    last_heart_beat_ts = 0 :: integer(), % 上次心跳时间(秒)
    agent :: pid()  % 负责接受解包后的数据的代理进程
}).